package cn.iocoder.yudao.framework.common.util.mail;
import cn.iocoder.yudao.framework.common.pojo.EmailInfo;
import cn.iocoder.yudao.framework.common.util.encryption.EncryptionUtil;

import javax.mail.*;
import javax.mail.internet.*;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
import java.util.Random;

public class MailUtils {
        /**
         * 发送邮件(参数自己根据自己的需求来修改，发送短信验证码可以直接套用这个模板)
         *
         * @param from_email 发送人的邮箱
         * @param pwd        发送人的授权码
         * @param recevices  接收人的邮箱
         * @param code       验证码
         * @param name       收件人的姓名
         * @return
         */
        public static String sendEmail(String from_email, String pwd,String str, String recevices, String code, String name,String tag)throws Exception {

            Properties props = new Properties();
            props.setProperty("mail.transport.protocol", "smtp");     //使用smpt的邮件传输协议
            props.setProperty("mail.smtp.host", "smtp.qiye.aliyun.com");       //主机地址
            props.setProperty("mail.smtp.auth", "true");      //授权通过

            Session session = Session.getInstance(props);     //通过我们的这些配置，得到一个会话程序
            try {
                MimeMessage message = new MimeMessage(session);
                message.setFrom(new InternetAddress(from_email));     //设置发件人
                message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(recevices,"用户","utf-8"));      //设置收件人
                message.setSubject("【数据学徒】请完成邮箱验证","utf-8");      //设置主题
                message.setSentDate(new Date());


                Multipart mul=new MimeMultipart();  //新建一个MimeMultipart对象来存放多个BodyPart对象
                BodyPart mdp=new MimeBodyPart();  //新建一个存放信件内容的BodyPart对象
                mdp.setContent(str, "text/html;charset=utf-8");
                mul.addBodyPart(mdp);  //将含有信件内容的BodyPart加入到MimeMultipart对象中
                message.setContent(mul); //把mul作为消息内容


                message.saveChanges();

                //创建一个传输对象
                Transport transport=session.getTransport("smtp");

                //建立与服务器的链接  465端口是 SSL传输
                transport.connect("smtp.qiye.aliyun.com", 25, from_email, pwd);

                //发送邮件
                transport.sendMessage(message,message.getAllRecipients());

                //关闭邮件传输
                transport.close();
            } catch (AddressException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (MessagingException e) {
                e.printStackTrace();
            }

            return "注册成功";
        }

    public static String codeFen() {
        String str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        /*String类 中 toCharArray()方法 将此字符串转换为一个新的字符数组。*/
        char[] VerificationCodeArray = str.toCharArray();
        Random random = new Random();
        int count = 0;/*计数器*/
        StringBuilder stringBuilder = new StringBuilder();
        while (true) {
            /*随机生成一个数组长度的随机数*/
            int index = random.nextInt(VerificationCodeArray.length);
            /*将随机生成的数所对应的元素赋给字符c*/
            char c = VerificationCodeArray[index];
        /*StringBuilder类中 indexOf()方法 从指定的索引处开始，
        返回第一次出现的指定子字符串在该字符串中的索引。如果不存在这样的 k 值，则返回 -1。
        "加上""自动转化为字符串"*/
            if (stringBuilder.indexOf(c + "") == -1) {
                /*StringBuilder类中 append(char c)方法 将 char 参数的字符串表示形式追加到此序列。*/
                stringBuilder.append(c);
                /*添加一次计数器自增1*/
                count++;
            }
            /*当count等于4时结束，随机生成四位数的验证码*/
            if (count == 4) {
                break;
            }
        }
        /*返回字符串*/
        return stringBuilder.toString();
    }


    public static boolean sendHtmlMail(EmailInfo emailInfo) {
        Properties properties = new Properties();
        properties.put("mail.smtp.host", "smtp.aliyun.com");
        properties.put("mail.transport.protocol", "smtp");
        properties.put("mail.smtp.auth", "true");
//        properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); // 使用JSSE的SSL
//        properties.put("mail.smtp.socketFactory.fallback", "false"); // 只处理SSL的连接,对于非SSL的连接不做处理
//        properties.put("mail.smtp.port", emailInfo.getPort());
//        properties.put("mail.smtp.socketFactory.port",emailInfo.getPort());
//        properties.put("mail.smtp.socketFactory.port",emailInfo.getPort());
        Session session = Session.getInstance(properties);
        session.setDebug(true);
        MimeMessage message = new MimeMessage(session);

        try {
            // 发件人
            Address address = new InternetAddress(emailInfo.getFromUserName());
            message.setFrom(address);
            // 收件人
            Address toAddress = new InternetAddress(emailInfo.getToUser());
            message.setRecipient(MimeMessage.RecipientType.TO, toAddress); // 设置收件人,并设置其接收类型为TO
            // 主题
            message.setSubject(emailInfo.getSubject());
            // 时间
            message.setSentDate(new Date());

            Multipart multipart = new MimeMultipart();

            // 创建一个包含HTML内容的MimeBodyPart
            BodyPart html = new MimeBodyPart();
            // 设置HTML内容
            html.setContent(emailInfo.getContent(), "text/html; charset=utf-8");
            multipart.addBodyPart(html);
            // 将MiniMultipart对象设置为邮件内容
            message.setContent(multipart);
            message.saveChanges();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }

        try {
            Transport transport = session.getTransport("smtp");
            transport.connect(emailInfo.getSmtpServer(), emailInfo.getFromUserName(), emailInfo.getFromUserPassword());
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
}
